package com.fantsey.test.juejin;

import java.util.ArrayList;
import java.util.List;

/**
 * 问题描述
 * 小R正在研究一组观光景点，每个景点都有一个评分，保存在数组 values 中，其中 values[i] 表示第 i 个观光景点的评分。同时，景点之间的距离由它们的下标差 j - i 表示。
 * 一对景点 (i < j) 的观光组合得分为 values[i] + values[j] + i - j，也就是两者评分之和减去它们之间的距离。
 * 小R想知道，在哪种情况下能够获得观光景点组合的最高得分。
 *
 * 约束条件：
 * 2 <= values.length
 * 1 <= values[i] <= 1000
 * 测试样例
 * 样例1：
 * 输入：values = [8, 3, 5, 5, 6]
 * 输出：11
 *
 * 样例2：
 * 输入：values = [10, 4, 8, 7]
 * 输出：16
 *
 * 样例3：
 * 输入：values = [1, 2, 3, 4, 5]
 * 输出：8
 *
 * @author fx
 * @date 2025/1/3
 * @since 1.0
 */
public class Question11 {

    public static int solution(int[] values) {
        // PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
        // write code here
        List<Integer> valueList = convertToList(values);
        List<Integer> scoreList = new ArrayList<>();
        getMaxCalculateScore(0, values.length, valueList, scoreList);
        return scoreList.stream().sorted().max(Integer::compareTo).get();
    }

    // AI写法
    /*public static int solution(int[] values) {
        // PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
        // write code here
        int maxScore = Integer.MIN_VALUE;
        int maxValue = values[0];

        for (int j = 1; j < values.length; j++) {
            // 计算当前组合的得分
            int score = maxValue + values[j] - j;
            // 更新最大得分
            maxScore = Math.max(maxScore, score);
            // 更新最大值
            maxValue = Math.max(maxValue, values[j] + j);
        }

        return maxScore;
    }*/


    public static void getMaxCalculateScore(int calculateIndex, int maxCalculateIndex,
                                            List<Integer> valueList, List<Integer> scoreList) {
        if (calculateIndex == maxCalculateIndex-1) {
            return;
        }
        int valueItemFrom = valueList.get(calculateIndex);
        for (int i = calculateIndex+1; i < valueList.size(); i++) {
            int valueItem = valueList.get(i);
            int score = valueItemFrom + valueItem + calculateIndex - i;
            scoreList.add(score);
        }
        calculateIndex++;
        getMaxCalculateScore(calculateIndex, maxCalculateIndex, valueList, scoreList);
    }

    private static List<Integer> convertToList(int[] values) {
        List<Integer> result = new ArrayList<>();
        for (int i : values) {
            result.add(i);
        }
        return result;
    }

    public static void main(String[] args) {
        //System.out.println(solution(new int[]{8, 3, 5, 5, 6}) == 11 ? 1 : 0);
        //System.out.println(solution(new int[]{10, 4, 8, 7}) == 16 ? 1 : 0);
        System.out.println(solution(new int[]{1, 2, 3, 4, 5}) == 8 ? 1 : 0);
    }
}
